package manager;

import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

import session.EnderecoSession;
import session.FuncionarioSession;
import session.NivelAcessoSession;
import session.ProfessorSession;
import session.TelefoneSession;
import util.FacesUtil;
import entidade.Endereco;
import entidade.Funcionario;
import entidade.NivelAcesso;
import entidade.Professor;
import entidade.Telefone;

@Named
@RequestScoped
public class FuncionarioManager {

	private List<Funcionario> funcionarios;
	
	@EJB
	private FuncionarioSession fSession;

	@EJB
	private NivelAcessoSession naSession;

	@EJB
	private TelefoneSession tSession;
	@EJB
	private ProfessorSession pSession;

	@EJB
	private EnderecoSession eSession;

	private Funcionario func = new Funcionario();
	private Endereco endereco = new Endereco();
	private Telefone telefone = new Telefone();
	private Professor prof = new Professor();

	private Integer acessoId;
	
	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public void saveFunc() {

		NivelAcesso nAcesso = naSession.findById(2);
		try{
		if (func.getId() == null) {
			func.setEndereco(endereco);
			func.setTelefone(telefone);
			eSession.insert(func.getEndereco());
			tSession.insert(func.getTelefone());
			func.setNivelDeAutorizacao(nAcesso);
			fSession.insert(func);
		}else {
			Funcionario f = fSession.buscarPorLogin(func.getLogin());
			endereco.setId(f.getEndereco().getId());
			telefone.setId_tel(f.getTelefone().getId_tel());
			func.setEndereco(endereco);
			func.setTelefone(telefone);
			fSession.update(func);
		}
		} catch(Exception e){
			e.printStackTrace();
			FacesUtil.mensErro("adicione um login diferente!");
		}
		cleanAtributes();
	}
	
	public void saveProf(){
		NivelAcesso nAcesso = naSession.findById(3);
		
		try{
			if (prof.getId() == null) {
				prof.setEndereco(endereco);
				prof.setTelefone(telefone);
				eSession.insert(prof.getEndereco());
				tSession.insert(prof.getTelefone());
				prof.setNivelDeAutorizacao(nAcesso);
				pSession.insert(prof);
			}else {
				Professor p = pSession.findById(prof.getId());
				endereco.setId(p.getEndereco().getId());
				telefone.setId_tel(p.getTelefone().getId_tel());
				prof.setEndereco(endereco);
				prof.setTelefone(telefone);
				prof.setNivelDeAutorizacao(nAcesso);
				pSession.update(prof);
			}
		} catch(Exception e){
			e.printStackTrace();
			FacesUtil.mensErro("adicione um login diferente!");
		}
		cleanAtributes();
	}
	
	public void cleanAtributes(){
		func = new Funcionario();
		prof = new Professor();
		endereco = new Endereco();
		telefone = new Telefone();
		acessoId = null;
	}

	public void excluir(Funcionario funcionario) {
		fSession.delete(funcionario);
	}

	public void prepararUpdate(Funcionario func) {
		if (func.getNivelDeAutorizacao().getAutorizacao().equals("ROLE_PROF")) {
			this.prof = pSession.buscarPorLogin(func.getLogin());
			this.endereco = prof.getEndereco();
			this.func = null;
		}else {
			this.func = fSession.buscarPorLogin(func.getLogin());
			this.endereco = this.func.getEndereco();
			this.prof = null;
		}
	}

	public String getDialog(Funcionario func){
		prepararUpdate(func);
		if (prof != null) {
			return "dialogGerProfessor.show()";
		}else if (this.func != null) {
			return "dialogGerAtendente.show()";
		}
		//#{funcionarioManager.getDialog(funcionarios)}
		return null;
	}
	public Funcionario getFunc() {
		return func;
	}

	public void setFunc(Funcionario func) {
		this.func = func;
	}

	public Integer getAcessoId() {
		return acessoId;
	}

	public void setAcessoId(Integer acessoId) {
		this.acessoId = acessoId;
	}

	public List<Funcionario> getFuncionarios() {
		if (funcionarios == null) {
			return funcionarios = fSession.findAll();
		}
		return funcionarios;
	}

	public void setFuncionarios(List<Funcionario> funcionarios) {
		this.funcionarios = funcionarios;
	}

	public Telefone getTelefone() {
		return telefone;
	}

	public void setTelefone(Telefone telefone) {
		this.telefone = telefone;
	}
	
	public Professor getProf() {
		return prof;
	}

	public void setProf(Professor prof) {
		this.prof = prof;
	}
}